// 常见定义方式
// 函数声明
function sum1_A(x: any, y: any): string {
    return (x + y).toString()
}

// 函数表达式
// 不完整版,  只是限制了后方函数
let sum1_B = function (x: number, y: number): number {
    return x + y
}

// 完整 全面限制 
// 在TS的类型定义中, =>用来表示函数的定义, 
// 左边是输入类型，需要用括号括起来; 右边是输出类型
let sum1_C: (x: string, y: string) => string = function (x: string, y: string): string {
    return x + y
}

// 完整 全面限制(接口)
interface SearchFunc1_A {
    (source: string, subString: string): string
}
let mySearch: SearchFunc1_A;
mySearch = function (source: string, subString: string) {
    return source + subString
}


// 可选参数
function sum2_A(x: number, y?: number): number {
    return y ? x + y : x
}

// 可选参数 错误示例
// 可选参数之后不允许出现必须参数
// function sum2_B(x?: number, y: number): number {
//     return y ? x + y : x
// }


// 剩余参数
// 采用ES6中 rest方式
function sum3_A(x: string, ...arr: any[]): any {
    return arr.unshift(x)
}



// 重载
// 详情查看http://ts.xcatliu.com/basics/type-of-function.html 底部